<?php

namespace app\home\controller;

class Token
{
    public $secretKey = 'hgakdfkljalfdjlk';//私钥
    public $termValidity = 60;//token有效时常（秒）
    /** 第一步：生成token */
    public function CreateToken($userid) {
        //用户名、此时的时间戳，并将过期时间拼接在一起
        $time = time();
        // 86400 => '天', 3600 => '小时', 60 => '分', 1 => '秒'
        $end_time = time() + $this->termValidity;//过期时间
        $info = $userid . '.' . $time . '.' . $end_time; //设置token过期时间为一天
        //根据以上信息信息生成签名（密钥为 SIGNATURE 自定义全局常量)
        $signature = hash_hmac('md5', $info, $this->secretKey);
        //最后将这两部分拼接起来，得到最终的Token字符串
        return $token = $info . '.' . $signature;
    }


    /** 第二步：验证token */
    public function check_token($token)
    {
        /**** api传来的token ****/
        if(!isset($token) || empty($token))
        {
            $msg['code']='400';
            $msg['msg']='非法请求';
            return json_encode($msg,JSON_UNESCAPED_UNICODE);
        }
        //对比token
        $explode = explode('.',$token);//以.分割token为数组
        if(!empty($explode[0]) && !empty($explode[1]) && !empty($explode[2]) && !empty($explode[3]) )
        {
            $info = $explode[0].'.'.$explode[1].'.'.$explode[2];//信息部分
            $true_signature = hash_hmac('md5',$info,$this->secretKey);//正确的签名
            if(time() > $explode[2])
            {
                $msg['code']='401';
                $msg['msg']='Token已过期,请重新登录';
                return json_encode($msg,JSON_UNESCAPED_UNICODE);
            }
            if ($true_signature == $explode[3])
            {
                $msg['code']='200';
                $msg['msg']='Token合法';
                return json_encode($msg,JSON_UNESCAPED_UNICODE);
            }
            else
            {
                $msg['code']='400';
                $msg['msg']='Token不合法';
                return json_encode($msg,JSON_UNESCAPED_UNICODE);
            }
        }
        else
        {
            $msg['code']='400';
            $msg['msg']='Token不合法';
            return json_encode($msg,JSON_UNESCAPED_UNICODE);
        }
    }



    /**
     *功能：将请求的用户账号密码===》生成token
     *参数一：需要解密的密文
     *参数二：密钥
     */
    public function CreateTokens($data = []) {
        $data = [
            'phone' => '13883487589',
            'password' => 'dengbiwei1999'
        ];
        if(empty($data)){
            $data['code'] = '400';
            $data['message'] = '非法请求';
            return $data;
        }

        $data['request_time'] = time();//当前时间
        $data['term_validity'] = $this->termValidity;//过期时间
        $dataJson = json_encode( $data );

        //根据以上信息信息生成签名
        return $this->passport_encrypt($dataJson, $this->secretKey);
    }


    /**
     *功能：校验token
     *参数一：需要解密的密文
     *参数二：密钥
     */
    function CheckToken($token) {

        if (!isset($token) || empty($token)) {
            $data['code'] = '400';
            $data['message'] = '非法请求';
            return $data;
        }

        $explode =$this->passport_decrypt($token, $this->secretKey); //解析token
        $expArr = json_decode($explode,true);
        $checkToken = $this->passport_encrypt(json_encode($expArr), $this->secretKey);

        $requestTime = $expArr['request_time'];
        $termValidity = $expArr['term_validity'];
        $checkTime = $requestTime+$termValidity;
        //对比token
        if($token != $checkToken){
            $data['code'] = '400';
            $data['message'] = '非法请求';
            return json_encode($data,JSON_UNESCAPED_UNICODE);
        }
        $time = time();
        if ($time > $checkTime) {
            $data['code'] = '401';
            $data['message'] = 'Token已过期,请重新登录';
            return json_encode($data,JSON_UNESCAPED_UNICODE);
        }
        $data['code'] = '200';
        $data['message'] = '合法Token';
        return json_encode($data,JSON_UNESCAPED_UNICODE);
    }
    /*
    *功能：对字符串进行加密处理
    *参数一：需要加密的内容
    *参数二：密钥
    */
    function passport_encrypt($str,$secretKey){ //加密函数
        return base64_encode($this->passport_key($str,$secretKey));
    }

    /*
    *功能：对字符串进行解密处理
    *参数一：需要解密的密文
    *参数二：密钥
    */
    function passport_decrypt($str,$secretKey){ //解密函数
        return $this->passport_key(base64_decode($str),$secretKey);
    }

    /*
    *辅助函数
    */
    function passport_key($str,$encrypt_key){
        $encrypt_key=md5($encrypt_key);
        $ctr=0;
        $tmp='';
        for($i=0;$i<strlen($str);$i++){
            $ctr=$ctr==strlen($encrypt_key)?0:$ctr;
            $tmp.=$str[$i] ^ $encrypt_key[$ctr++];
        }
        return $tmp;
    }
}